import numpy as np  # 导入numpy模块
import pandas as pd  # 导入pandas模块

pd.set_option('display.unicode.ambiguous_as_wide', True)
pd.set_option('display.unicode.east_asian_width', True)

df = pd.read_excel('./超市营业额2.xlsx')

print('根据lambda表达式对index处理后的结果分组'.ljust(30, '='))
# 根据索引值除以5的余数进行分组，并对'交易额'列求和
print(df.groupby(by=lambda num: num % 5)['交易额'].sum())

print('\n指定by参数为字典，键作为index进行分组，值作为index标签'.ljust(30, '='))
# 使用指定的字典对数据进行分组，并根据字典中的键对'交易额'列求和
print(df.groupby(by={7: '下标为7的行', 35: '下标为35的行'})['交易额'].sum())

print('不同时段的销售总额'.ljust(30, '='))
print(df.groupby(by='时段')['交易额'].sum())
print('各柜台的销售总额'.ljust(30, '='))
print(df.groupby(by='柜台')['交易额'].sum())

# 可以查看每个员工上班总时长是否均匀
print('每个员工上班的次数'.ljust(30, '='))
dff = df.groupby(by=['姓名', '日期']).count()
dff.name = '上班次数'
print(dff)

print('每个员工交易额平均值'.ljust(30, '='))
print(df.groupby(by='姓名')['交易额'].mean().round(2).sort_values())

print('汇总交易额转换为整数'.ljust(30, '='))
print(df.groupby(by='姓名')['交易额'].sum().apply(int))

print('每个员工交易额的中值'.ljust(30, '='))
print(df.groupby(by='姓名')['交易额'].median(numeric_only=True))

dff['排名'] = dff['交易额'].rank(ascending=False)  # 添加一列排名
print('每个员工交易额由高到低排名'.ljust(30, '='), dff[['交易额', '排名']], sep='\n')

print('每个员工不同时段的交易额'.ljust(30, '='))
print(df.groupby(by=['姓名', '时段'])['交易额'].sum())

# 对不同的列可以采用不同的函数
print('时段和交易额采用不同的聚合方式'.ljust(30, '='))
print(df.groupby(by=['姓名'])[['时段', '交易额']].aggregate({'交易额': np.sum, '时段': lambda x: '各时段累计'}))

# 使用 DataFrame 结构的 agg() 方法对指定列进行聚合
print('使用 agg() 方法对交易额进行聚合'.ljust(30, '='))
print(df.agg({'交易额': ['sum', 'mean', 'min', 'max', 'median'], '日期': ['min', 'max']}))

print('对分组结果进行聚合'.ljust(30, '='))
print(df.groupby(by='姓名')[['工号', '交易额']].agg(['max', 'min', 'mean', 'median']))

print('查看分组聚合后的部分结果'.ljust(30, '='))
print(df.groupby(by='姓名')[['交易额']].agg(['max', 'min', 'mean', 'median']))
